home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-10-06 | 4.4 KB | 240 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // BlitPixieClear - color fill blitter
- //
- // written by Anders F Björklund <afb@algonet.se>
- // ©1999 afb.
- ///--------------------------------------------------------------------------------------
-
- #ifndef __BLITPIXIE__
- #include "BlitPixieHeader.h"
- #endif
-
- #include "BlitPixieAsm.h"
-
- #pragma mark *** PowerPC asm :
- #if USE_PPC_ASSEMBLY
-
- // NOTE: assumes dstRowBytes is multiple of 4 (for alignment purposes)
- // NOTE: assumes bytes, rows > 0
-
- ASM_FUNC void BlitPixieClear(
- register unsigned char *dst, // r3
- register unsigned long dstRowBytes, // r4
- register unsigned short bytes, // r5
- register unsigned short rows, // r6
- register unsigned long clear ) // r7
- {
- #define r_dst r3
- #define r_dstRowBytes r4
- #define r_bytes r5
- #define r_rows r6
- #define r_clear r7
-
- #define r_dstStride r31
- #define r_y r30
- #define r_align r29
- #define r_chunks r29
- #define r_leftover r28
- #define r_offset r0
-
- #define kRegisterSaveStack (4 * 4)
-
- ASM_BEGIN
- stmw r28,-kRegisterSaveStack(SP)
-
- stw r_clear,-(kRegisterSaveStack+8)(SP)
- stw r_clear,-(kRegisterSaveStack+4)(SP)
-
- sub r_dstStride,r_dstRowBytes,r_bytes
-
- // alignment offset (dst & 7)
- neg r_align,r_dst
- rlwinm r_align,r_align,0,29,31
- cmplw r_align,r_bytes
- ble @alignok
- mr r_align,r_bytes
- @alignok:
- sub r_bytes,r_bytes,r_align
-
- rlwinm r_align,r_align,8,20,23
- mtcrf 4,r_align // cr5
-
- rlwinm r_chunks,r_bytes,27,5,31
- rlwinm r_leftover,r_bytes,0,27,31
-
- subi r_dst,r_dst,32
- li r_offset,32
-
- mr r_y,r_rows
- mtxer r_leftover
-
- lfd fp0,-(kRegisterSaveStack+8)(SP)
-
- cmplwi cr6,r_chunks,0
- cmplwi cr7,r_leftover,0
-
- mr r5,r_clear
- mr r6,r_clear
- mr r7,r_clear
- mr r8,r_clear
- mr r9,r_clear
- mr r10,r_clear
- mr r11,r_clear
- mr r12,r_clear
-
- @yloop1:
-
- // align to double boundary
- bns cr5,@skipalignByte1
- stb r_clear,32(r_dst)
- addi r_dst,r_dst,1
- @skipalignByte1:
- bne cr5,@skipalignWord1
- sth r_clear,32(r_dst)
- addi r_dst,r_dst,2
- @skipalignWord1:
- bng cr5,@skipalignLong1
- stw r_clear,32(r_dst)
- addi r_dst,r_dst,4
- @skipalignLong1:
-
- // copy 32 byte blocks (using doubles)
- beq cr6,@skiploop1
- mtctr r_chunks
- @loop1:
- stfdu fp0,32(r_dst)
- stfd fp0,8(r_dst)
- stfd fp0,16(r_dst)
- stfd fp0,24(r_dst)
- bdnz @loop1
- @skiploop1:
-
- subic. r_y,r_y,1
-
- // copy left-over bytes (<32)
- beq cr7,@skipleftover1
- stswx r5,r_dst,r_offset
- add r_dst,r_dst,r_leftover
- @skipleftover1:
-
- add r_dst,r_dst,r_dstStride
-
- bne @yloop1
-
- lmw r28,-kRegisterSaveStack(SP)
- ASM_END
- }
-
- #pragma mark *** 680x0 asm :
- #elif USE_68K_ASSEMBLY
-
- ASM_FUNC void BlitPixieClear(
- unsigned char *dst,
- unsigned long dstRowBytes,
- unsigned short bytesPerRow,
- unsigned short rows,
- unsigned long clear )
- {
- #define D_dstBytes D2
- #define D_bytes D3
-
- ASM_BEGIN
-
- MOVEM.L D3-D4/A2,-(SP)
-
- MOVE.L clear,A0
- MOVE.L dst,A1
- MOVE.L dstRowBytes,D2
- MOVE.W bytesPerRow,D3
- MOVE.W rows,D4
-
- EXT.L D_bytes
- SUB.L D_bytes,D_dstBytes
-
- // *** LOOP SETUP ***
- MOVEQ #15,D0
- CLR.L D1
-
- MOVE.W D_bytes,D1
- LSR.W #2,D1 // / sizeof(long)
- AND.W D0,D1
- ADD.W D1,D1 // * sizeof(MOVE.L (A0)+,(A1)+)
- LEA @loopend,A2
- SUBA.L D1,A2
-
- MOVE.W D_bytes,D1
- LSR.W #6,D1
-
- // *** COPY ***
-
- @rowloop:
-
- // align to word boundary
- // main word copy loop
- MOVE.W D1,D0
- JMP (A2)
- @loopstart:
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- MOVE.L A0,(A1)+
- @loopend:
- DBRA D0,@loopstart
-
- // do left-overs
- MOVE.W D_bytes,D0
- ANDI.W #2,D0
- BEQ.S @restword
- MOVE.W A0,(A1)+
- @restword:
- MOVE.W D_bytes,D0
- ANDI.W #1,D0
- BEQ.S @restbyte
- /* MOVE.B A0,(A1)+ */ dc.w 0x12C8 // <--- THINK won't let us ?
- @restbyte:
-
- ADDA.L D_dstBytes,A1
-
- SUBQ.W #1,D4
- BNE.S @rowloop
-
- MOVEM.L (SP)+,D3-D4/A2
-
- ASM_END
- }
-
- #pragma mark *** Generic C :
- #elif USE_GENERIC_C
-
- void BlitPixieClear(
- unsigned char *dst,
- unsigned long dstRowBytes,
- unsigned short bytes,
- unsigned short rows,
- unsigned long clear )
- {
- BLITPIXIE_ASSERT(rows > 0 );
- BLITPIXIE_ASSERT(bytes > 0 );
-
- while (rows--)
- {
- BlitPixieMemSet( dst, clear, bytes );
- dst += dstRowBytes;
- }
- }
-
- #endif // GENERATING…
-
-